#!/bin/bash

# EMS Web前端构建脚本
# 用途: 构建Vue.js前端项目并准备部署

set -e  # 遇到错误时退出

# 脚本配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
WEB_DIR="$PROJECT_ROOT/web/frontend"
BUILD_DIR="$PROJECT_ROOT/build/web"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查依赖
check_dependencies() {
    log_info "检查构建依赖..."
    
    if ! command -v node &> /dev/null; then
        log_error "Node.js未安装，请先安装Node.js (>=16.0)"
        exit 1
    fi
    
    if ! command -v npm &> /dev/null; then
        log_error "npm未安装，请先安装npm"
        exit 1
    fi
    
    NODE_VERSION=$(node --version | cut -d 'v' -f 2 | cut -d '.' -f 1)
    if [ "$NODE_VERSION" -lt 16 ]; then
        log_error "Node.js版本过低 (当前: v$NODE_VERSION)，需要>=16.0"
        exit 1
    fi
    
    log_success "依赖检查通过"
}

# 安装依赖
install_dependencies() {
    log_info "安装前端依赖..."
    
    cd "$WEB_DIR"
    
    if [ ! -f "package.json" ]; then
        log_error "未找到package.json文件"
        exit 1
    fi
    
    # 检查是否有package-lock.json或yarn.lock
    if [ -f "package-lock.json" ]; then
        npm ci
    elif [ -f "yarn.lock" ]; then
        if command -v yarn &> /dev/null; then
            yarn install --frozen-lockfile
        else
            log_warning "找到yarn.lock但未安装yarn，使用npm安装"
            npm install
        fi
    else
        npm install
    fi
    
    log_success "依赖安装完成"
}

# 代码质量检查
lint_check() {
    if [ "$SKIP_LINT" = "true" ]; then
        log_warning "跳过代码质量检查"
        return
    fi
    
    log_info "执行代码质量检查..."
    
    cd "$WEB_DIR"
    
    # 检查是否配置了lint脚本
    if npm run | grep -q "lint"; then
        npm run lint
        log_success "代码质量检查通过"
    else
        log_warning "未找到lint脚本，跳过代码质量检查"
    fi
}

# 构建前端
build_frontend() {
    log_info "构建Vue.js前端..."
    
    cd "$WEB_DIR"
    
    # 设置构建环境变量
    export NODE_ENV=production
    export GENERATE_SOURCEMAP=false
    
    # 执行构建
    npm run build
    
    if [ ! -d "dist" ]; then
        log_error "构建失败，未找到dist目录"
        exit 1
    fi
    
    log_success "前端构建完成"
}

# 优化构建产物
optimize_build() {
    log_info "优化构建产物..."
    
    cd "$WEB_DIR/dist"
    
    # 计算构建产物大小
    BUILD_SIZE=$(du -sh . | cut -f1)
    log_info "构建产物大小: $BUILD_SIZE"
    
    # 检查是否有gzip压缩的资源
    if ls *.gz 1> /dev/null 2>&1; then
        log_info "发现gzip压缩文件"
        GZIP_SIZE=$(du -sh *.gz | awk '{sum+=$1} END {print sum"K"}' 2>/dev/null || echo "未知")
        log_info "Gzip压缩后大小: $GZIP_SIZE"
    fi
    
    # 检查大文件
    find . -name "*.js" -size +500k -exec ls -lh {} \; | while read file; do
        log_warning "发现大文件: $(echo $file | awk '{print $9 " (" $5 ")"}')"
    done
    
    log_success "构建优化检查完成"
}

# 复制到构建目录
copy_to_build_dir() {
    log_info "复制构建产物到输出目录..."
    
    # 先清理旧的构建输出，避免残留历史资源
    if [ -d "$BUILD_DIR" ]; then
        rm -rf "$BUILD_DIR"
    fi
    
    # 创建构建输出目录
    mkdir -p "$BUILD_DIR"
    
    # 复制dist目录内容
    cp -r "$WEB_DIR/dist/"* "$BUILD_DIR/"
    
    # 生成构建信息文件
    cat > "$BUILD_DIR/build-info.json" << EOF
{
  "build_time": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
  "build_version": "$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')",
  "node_version": "$(node --version)",
  "npm_version": "$(npm --version)",
  "build_size": "$BUILD_SIZE",
  "build_type": "production"
}
EOF
    
    log_success "构建产物已复制到: $BUILD_DIR"
}

# 生成嵌入头文件
generate_embedded_resources() {
    log_info "生成C++嵌入式资源文件..."
    
    EMBED_SCRIPT="$SCRIPT_DIR/embed-web-resources.py"
    EMBED_OUTPUT="$PROJECT_ROOT/src/web/EmbeddedWebResources.h"
    
    if [ -f "$EMBED_SCRIPT" ]; then
        mkdir -p "$(dirname "$EMBED_OUTPUT")"
        python3 "$EMBED_SCRIPT" "$BUILD_DIR" "$EMBED_OUTPUT"
        log_success "嵌入式资源文件已生成: $EMBED_OUTPUT"
    else
        log_warning "未找到资源嵌入脚本，跳过C++资源生成"
    fi
}

# 清理函数
cleanup() {
    log_info "清理临时文件..."
    # 可以在这里添加清理逻辑
}

# 主函数
main() {
    log_info "开始构建EMS Web前端..."
    log_info "项目根目录: $PROJECT_ROOT"
    log_info "前端目录: $WEB_DIR"
    log_info "输出目录: $BUILD_DIR"
    
    # 捕获退出信号进行清理
    trap cleanup EXIT
    
    # 检查前端目录是否存在
    if [ ! -d "$WEB_DIR" ]; then
        log_error "前端目录不存在: $WEB_DIR"
        exit 1
    fi
    
    # 执行构建流程
    check_dependencies
    install_dependencies
    lint_check
    build_frontend
    optimize_build
    copy_to_build_dir
    generate_embedded_resources
    
    log_success "Web前端构建完成！"
    log_info "构建产物位置: $BUILD_DIR"
    log_info "可以运行以下命令启动C++后端服务:"
    log_info "  cd $PROJECT_ROOT && ./scripts/build.sh && ./build/ems-cpp-v1"
}

# 处理命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        --skip-lint)
            SKIP_LINT=true
            shift
            ;;
        --help|-h)
            echo "用法: $0 [选项]"
            echo "选项:"
            echo "  --skip-lint    跳过代码质量检查"
            echo "  --help, -h     显示此帮助信息"
            exit 0
            ;;
        *)
            log_error "未知选项: $1"
            exit 1
            ;;
    esac
done

# 执行主函数
main